Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/TracerouteChart.kt 520fa717a938fd84682403b41f57d9f7e1ef49ef (520fa717) Text, 10.55 KB

T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMatchingDeclarationNameTa5d6ff"Tb4b4b4)

Tff7b72package T7ee787org.meshtastic.feature.node.metrics

Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.VicoScrollState
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.Axis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.lineSeries
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer
Tff7b72import T7ee787org.meshtastic.core.common.util.formatString
Tff7b72import T7ee787org.meshtastic.core.model.MeshLog
Tff7b72import T7ee787org.meshtastic.core.model.fullRouteDiscovery
Tff7b72import T7ee787org.meshtastic.core.model.util.TimeConstants.MS_PER_SEC
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_duration
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_forward_hops
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_outgoing_route
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_return_hops
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_return_route
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_round_trip
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors

T8b949e/** Resolved traceroute data point pairing a request with its optional response. */
Tff7b72internal Tff7b72data Tff7b72class T56d364TraceroutePointTb4b4b4(
Tff7b72val Te6edf3requestTb4b4b4: Te6edf3MeshLogTb4b4b4,
Tff7b72val Te6edf3resultTb4b4b4: Te6edf3MeshLog?Tb4b4b4,
T8b949e/** Request timestamp in epoch seconds, used as the chart X coordinate. */
Tff7b72val Te6edf3timeSecondsTb4b4b4: Tffa657DoubleTb4b4b4,
T8b949e/** Number of intermediate hops toward the destination, or null if no response received. */
Tff7b72val Te6edf3forwardHopsTb4b4b4: Tffa657Int?Tb4b4b4,
T8b949e/** Number of intermediate hops on the return path, or null if unavailable. */
Tff7b72val Te6edf3returnHopsTb4b4b4: Tffa657Int?Tb4b4b4,
T8b949e/** Round-trip duration in seconds between request sent and response received, or null. */
Tff7b72val Te6edf3roundTripSecondsTb4b4b4: Tffa657Double?Tb4b4b4,
Tb4b4b4)

T8b949e/** Chart series colours for the three traceroute metrics. */
Tff7b72private Tff7b72enum Tff7b72class T56d364TracerouteMetricTb4b4b4(Tff7b72val Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4) Tb4b4b4{
Te6edf3FORWARD_HOPSTb4b4b4(Te6edf3GraphColorsTb4b4b4.Te6edf3BlueTb4b4b4)Tb4b4b4,
Te6edf3RETURN_HOPSTb4b4b4(Te6edf3GraphColorsTb4b4b4.Te6edf3GreenTb4b4b4)Tb4b4b4,
Te6edf3ROUND_TRIPTb4b4b4(Te6edf3GraphColorsTb4b4b4.Te6edf3OrangeTb4b4b4)Tb4b4b4,
Tb4b4b4}

T8b949e/** Legend entries for the traceroute chart — forward hops, return hops, and round-trip duration. */
Tff7b72internal Tff7b72val Te6edf3TRACEROUTE_LEGEND_DATA Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LegendDataTb4b4b4(
Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_forward_hopsTb4b4b4,
Te6edf3color Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3FORWARD_HOPSTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(
Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_return_hopsTb4b4b4,
Te6edf3color Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3RETURN_HOPSTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(
Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_round_tripTb4b4b4,
Te6edf3color Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3ROUND_TRIPTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

T8b949e/** Info-dialog entries describing each traceroute metric for the legend help overlay. */
Tff7b72internal Tff7b72val Te6edf3TRACEROUTE_INFO_DATA Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3titleRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_forward_hopsTb4b4b4,
Te6edf3definitionRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_outgoing_routeTb4b4b4,
Te6edf3color Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3FORWARD_HOPSTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3titleRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_return_hopsTb4b4b4,
Te6edf3definitionRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_return_routeTb4b4b4,
Te6edf3color Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3RETURN_HOPSTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3titleRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_round_tripTb4b4b4,
Te6edf3definitionRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_durationTb4b4b4,
Te6edf3color Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3ROUND_TRIPTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

T8b949e/**
* Matches each traceroute request with its response (if any) and computes hop counts and round-trip duration. Results
* are ordered the same as [requests] — newest-first when coming from the ViewModel.
*/
Tff7b72internal Tff7b72fun Td2a8ffresolveTraceroutePointsTb4b4b4(Te6edf3requestsTb4b4b4: Te6edf3ListTff7b72<Te6edf3MeshLogTff7b72>Tb4b4b4, Te6edf3resultsTb4b4b4: Te6edf3ListTff7b72<Te6edf3MeshLogTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3TraceroutePointTff7b72> Tff7b72=
Te6edf3requestsTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3request Tff7b72-Tff7b72>
Tff7b72val Te6edf3requestPacketId Tff7b72= Te6edf3requestTb4b4b4.Te6edf3fromRadioTb4b4b4.Te6edf3packetTff7b72?.Te6edf3id
Tff7b72val Te6edf3result Tff7b72= Te6edf3resultsTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fromRadioTb4b4b4.Te6edf3packetTff7b72?.Te6edf3decodedTff7b72?.Te6edf3request_id Tff7b72=Tff7b72= Te6edf3requestPacketId Tb4b4b4}
Tff7b72val Te6edf3route Tff7b72= Te6edf3resultTff7b72?.Te6edf3fromRadioTff7b72?.Te6edf3packetTff7b72?.Te6edf3fullRouteDiscovery
Tff7b72val Te6edf3timeSeconds Tff7b72= Te6edf3requestTb4b4b4.Te6edf3received_dateTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3MS_PER_SEC

Tff7b72val Te6edf3forwardHops Tff7b72= Te6edf3routeTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3maxOfTb4b4b4(T79c0ff0Tb4b4b4, Tffa657itTb4b4b4.Te6edf3routeTb4b4b4.Te6edf3size Tff7b72- T79c0ff2Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3returnHops Tff7b72= Te6edf3routeTff7b72?.Te6edf3let Tb4b4b4{ Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3route_backTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3maxOfTb4b4b4(T79c0ff0Tb4b4b4, Tffa657itTb4b4b4.Te6edf3route_backTb4b4b4.Te6edf3size Tff7b72- T79c0ff2Tb4b4b4) Tff7b72else Tff7b72null Tb4b4b4}
Tff7b72val Te6edf3roundTrip Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3result Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tb4b4b4(Te6edf3resultTb4b4b4.Te6edf3received_date Tff7b72- Te6edf3requestTb4b4b4.Te6edf3received_dateTb4b4b4)Tb4b4b4.Te6edf3coerceAtLeastTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3MS_PER_SEC
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}

Te6edf3TraceroutePointTb4b4b4(
Te6edf3request Tff7b72= Te6edf3requestTb4b4b4,
Te6edf3result Tff7b72= Te6edf3resultTb4b4b4,
Te6edf3timeSeconds Tff7b72= Te6edf3timeSecondsTb4b4b4,
Te6edf3forwardHops Tff7b72= Te6edf3forwardHopsTb4b4b4,
Te6edf3returnHops Tff7b72= Te6edf3returnHopsTb4b4b4,
Te6edf3roundTripSeconds Tff7b72= Te6edf3roundTripTb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Vico chart composable that renders forward hops, return hops, and round-trip duration as separate line series with
* dual Y-axes: hops on the start axis (fixed min 0) and RTT seconds on the end axis.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffTracerouteMetricsChartTb4b4b4(
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3pointsTb4b4b4: Te6edf3ListTff7b72<Te6edf3TraceroutePointTff7b72>Tb4b4b4,
Te6edf3vicoScrollStateTb4b4b4: Te6edf3VicoScrollStateTb4b4b4,
Te6edf3selectedXTb4b4b4: Tffa657Double?Tb4b4b4,
Te6edf3onPointSelectedTb4b4b4: Tb4b4b4(Tffa657DoubleTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3MetricChartScaffoldTb4b4b4(Te6edf3isEmpty Tff7b72= Te6edf3pointsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3legendData Tff7b72= Te6edf3TRACEROUTE_LEGEND_DATATb4b4b4, Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4) Tb4b4b4{
Te6edf3modelProducerTb4b4b4,
Te6edf3chartModifierTb4b4b4,
Tff7b72-Tff7b72>
Tff7b72val Te6edf3forwardData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3pointsTb4b4b4) Tb4b4b4{ Te6edf3pointsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3forwardHops Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3returnData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3pointsTb4b4b4) Tb4b4b4{ Te6edf3pointsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3returnHops Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3rttData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3pointsTb4b4b4) Tb4b4b4{ Te6edf3pointsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3roundTripSeconds Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}

Te6edf3LaunchedEffectTb4b4b4(Te6edf3forwardDataTb4b4b4, Te6edf3returnDataTb4b4b4, Te6edf3rttDataTb4b4b4) Tb4b4b4{
Te6edf3modelProducerTb4b4b4.Te6edf3runTransaction Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3forwardDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineSeries Tb4b4b4{
Te6edf3seriesTb4b4b4(Te6edf3x Tff7b72= Te6edf3forwardDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeSeconds Tb4b4b4}Tb4b4b4, Te6edf3y Tff7b72= Te6edf3forwardDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3forwardHopsTff7b72!! Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3returnDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineSeries Tb4b4b4{ Te6edf3seriesTb4b4b4(Te6edf3x Tff7b72= Te6edf3returnDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeSeconds Tb4b4b4}Tb4b4b4, Te6edf3y Tff7b72= Te6edf3returnDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3returnHopsTff7b72!! Tb4b4b4}Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3rttDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineSeries Tb4b4b4{ Te6edf3seriesTb4b4b4(Te6edf3x Tff7b72= Te6edf3rttDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeSeconds Tb4b4b4}Tb4b4b4, Te6edf3y Tff7b72= Te6edf3rttDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3roundTripSecondsTff7b72!! Tb4b4b4}Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3forwardColor Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3FORWARD_HOPSTb4b4b4.Te6edf3color
Tff7b72val Te6edf3returnColor Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3RETURN_HOPSTb4b4b4.Te6edf3color
Tff7b72val Te6edf3rttColor Tff7b72= Te6edf3TracerouteMetricTb4b4b4.Te6edf3ROUND_TRIPTb4b4b4.Te6edf3color

Tff7b72val Te6edf3marker Tff7b72=
Te6edf3ChartStylingTb4b4b4.Te6edf3rememberMarkerTb4b4b4(
Te6edf3valueFormatter Tff7b72=
Te6edf3ChartStylingTb4b4b4.Te6edf3createColoredMarkerValueFormatter Tb4b4b4{ Te6edf3valueTb4b4b4, Te6edf3color Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3colorTb4b4b4) Tb4b4b4{
Te6edf3forwardColor Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Ta5d6ff"Ta5d6ffFwd: %.0f hopsTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4)
Te6edf3returnColor Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Ta5d6ff"Ta5d6ffRet: %.0f hopsTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Ta5d6ff"Ta5d6ffRTT: %.1f sTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3forwardLayer Tff7b72=
Te6edf3rememberConditionalLayerTb4b4b4(
Te6edf3hasData Tff7b72= Te6edf3forwardDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3createStyledLineTb4b4b4(Te6edf3forwardColorTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3StartTb4b4b4,
Te6edf3rangeProvider Tff7b72= Te6edf3CartesianLayerRangeProviderTb4b4b4.Te6edf3fixedTb4b4b4(Te6edf3minY Tff7b72= T79c0ff0.0Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3returnLayer Tff7b72=
Te6edf3rememberConditionalLayerTb4b4b4(
Te6edf3hasData Tff7b72= Te6edf3returnDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3createDashedLineTb4b4b4(Te6edf3returnColorTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3StartTb4b4b4,
Te6edf3rangeProvider Tff7b72= Te6edf3CartesianLayerRangeProviderTb4b4b4.Te6edf3fixedTb4b4b4(Te6edf3minY Tff7b72= T79c0ff0.0Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3rttLayer Tff7b72=
Te6edf3rememberConditionalLayerTb4b4b4(
Te6edf3hasData Tff7b72= Te6edf3rttDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3createGradientLineTb4b4b4(Te6edf3rttColorTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3EndTb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3layers Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3forwardLayerTb4b4b4, Te6edf3returnLayerTb4b4b4, Te6edf3rttLayerTb4b4b4) Tb4b4b4{ Te6edf3listOfNotNullTb4b4b4(Te6edf3forwardLayerTb4b4b4, Te6edf3returnLayerTb4b4b4, Te6edf3rttLayerTb4b4b4) Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3layersTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3GenericMetricChartTb4b4b4(
Te6edf3modelProducer Tff7b72= Te6edf3modelProducerTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3chartModifierTb4b4b4,
Te6edf3layers Tff7b72= Te6edf3layersTb4b4b4,
Te6edf3startAxis Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3forwardDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3returnDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3VerticalAxisTb4b4b4.Te6edf3rememberStartTb4b4b4(
Te6edf3label Tff7b72= Te6edf3ChartStylingTb4b4b4.Te6edf3rememberAxisLabelTb4b4b4(Te6edf3color Tff7b72= Te6edf3forwardColorTb4b4b4)Tb4b4b4,
Te6edf3valueFormatter Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3valueTb4b4b4, Te6edf3_ Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Ta5d6ff"Ta5d6ff%.0fTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3endAxis Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3rttDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3VerticalAxisTb4b4b4.Te6edf3rememberEndTb4b4b4(
Te6edf3label Tff7b72= Te6edf3ChartStylingTb4b4b4.Te6edf3rememberAxisLabelTb4b4b4(Te6edf3color Tff7b72= Te6edf3rttColorTb4b4b4)Tb4b4b4,
Te6edf3valueFormatter Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3valueTb4b4b4, Te6edf3_ Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Ta5d6ff"Ta5d6ff%.1f sTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3bottomAxis Tff7b72= Te6edf3CommonChartsTb4b4b4.Te6edf3rememberBottomTimeAxisTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3marker Tff7b72= Te6edf3markerTb4b4b4,
Te6edf3selectedX Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onPointSelected Tff7b72= Te6edf3onPointSelectedTb4b4b4,
Te6edf3vicoScrollState Tff7b72= Te6edf3vicoScrollStateTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.08s